踏上冒險之旅的第一步,我個人的習慣是:先打開地圖看一看。
記得小時候在系統程式課上拿到的 C/C++ 編譯地圖大概長這樣:
從源代碼(Source Code) 到可執行檔 (Executable File) 或庫文件 (Library) 中間的路上,首先會遇到編譯器 (Compiler) 將源代碼編譯成組合語言 (Assembler Language),再由組譯器 (Assembler) 組譯成目標檔案 (Object File),接著由連結器 (Linker) 將多個目標檔案 (Object File) 連結 (Link) 成可執行檔 (Executable File) 或庫文件 (Library)。
雖然目前的編譯器大部分都可以直接將源代碼編譯成目的檔,將中間編譯成組合語言的步驟隱藏起來不讓使用者察覺,但這邊還是將整條路徑攤開來看。
接著來介紹一下這一路上會遇到的叔叔阿姨伯伯三叔公們:
源代碼 (Source Code)
就是你寫的C/C++程式檔案,包含標頭文件 (Header File, .h, .hpp) 與 源碼文件 (Source File, .c, .cpp)。
編譯器 (Compiler)
就是用於將 C/C++ 程式語言編譯成組合語言或目的檔的工具。
組合語言 (Assembler Language)
組合語言 (Assembler Language, .asm) 是一種低階程式語言,夾在高階語言 (例如: C/C++) 和機器語言之間的角色。
前置式表示法
,也就是目標在前的指令撰寫方式 ,其對於這行指令 ADD R1, R2, R3
的解讀就是 將暫存器2的數值與暫存器3的數值相加並把結果放到暫存器1
,若為 後置式表示法
,也就是目標在後的指令撰寫方式,其對於那行指令的解讀就是 將暫存器1的數值與暫存器2的數值相加並把結果放到暫存器3
。組譯器 (Assembler)
就是負責對組合語言做組譯的工具,其主要的功能,是將組合語言轉換為目的檔 (就是機器碼,是二進制碼組成的,a.k.a 一堆由0101 組成的東西) 的工具。
目的檔 (Object File)
就是編譯過程中生成的中間檔案,是二進制文件,包含了源代碼編譯後的機器代碼、符號表、段信息等資訊。
連結器 (Linker)
就是用來連接目的檔與靜態庫的工具。
可執行檔 (Executable File)
就是最終可以直接執行的程式檔案。
庫文件 (Library)
就是包含已經編譯過的、可重用的程式碼和資源的二進制文件集合,用於軟體開發中的模組化和代碼重用。
以上就是編譯的路上會遇到的角色介紹,下篇會以 Linux 與 Windows 系統為例,進一步指出上述的角色們的在此兩種系統中實際上是哪些東西,揭開他們的真面目!